g = (x * 3 for x in range(20))
print(type(g))
print(g)

# 方式一：通过调用__next__()方法来获取生成器中的值
print(g.__next__()) # 0
print(g.__next__()) # 3
print(g.__next__()) # 6
print(g.__next__()) # 9
print('------------------------')
# 方式二：next(生成器对象) builtins 系统内置函数
# 每调用一次next则会产生一个元素
print(next(g)) # 12
print(next(g)) # 15
print(next(g)) # 18
print('------------------------')

s = (x * 2 for x in range(10))
while True:
    try:
        e = next(s)
        print(e)
    except:
        print('生成器已经没有元素了')
        break
print('------------------------')

# 定义生成器的方式二；借助函数完成
# 只要函数中出现了yield关键字，则该函数就变成了一个生成器了
# def func():
#     n = 0
#     while True:
#         n += 1
#         print(n)
#         yield n # return n + 暂停
#
# g = func()
# print(g)

# print(next(g))
# print(next(g))
# print(next(g))
# print(next(g))
print('------------------------')

# 斐波那契数列
'''
步骤：
1. 定义一个函数，函数中使用yield关键字
2.调用函数，接收调用的结果
3.得到的结果就是生成器
4.借助于next(),__next__()方法来获取生成器中的元素
'''
def fib(length):
    a,b = 0,1
    n = 0
    while n < length:
        print(b)
        yield b # return b + 暂停
        a,b = b,a+b
        n += 1

g = fib(5)
print(next(g))
print(next(g))
print(next(g))
print(next(g))
